import { createRouter, createWebHashHistory } from 'vue-router';
import { ElNotification } from 'element-plus';
import config from "@renderer/config"
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import tool from '@renderer/utils/tool';
import systemRouter from './systemRouter';
import userRoutes from '@renderer/config/route';
import { beforeEach, afterEach } from './scrollBehavior';

//系统路由
const routes = systemRouter

//系统特殊路由
const routes_404 = {
  name: '404',
	path: "/:pathMatch(.*)*",
	hidden: true,
	component: () => import(/* webpackChunkName: "404" */ '@renderer/layout/other/404'),
}
let routes_404_r = ()=>{}

var router = createRouter({
	history: createWebHashHistory(),
	routes: routes
})

//设置标题
document.title = config.APP_NAME

//判断是否已加载过动态/静态路由
var isGetRouter = false;

router.beforeEach(async (to, from, next) => {

	NProgress.start()
	//动态标题
	document.title = to.meta.title ? `${to.meta.title} - ${config.APP_NAME}` : `${config.APP_NAME}`

	let token = tool.cookie.get("TOKEN");

	if(to.path === "/login"){
		//删除路由(替换当前layout路由)
		router.addRoute(routes[0])
		//删除路由(404)
		routes_404_r()
		isGetRouter = false;
		next();
		return false;
	}

	if(routes.findIndex(r => r.path === to.path) >= 0){
		next();
		return false;
	}

	if(!token){
		next({
			path: '/login'
		});
		return false;
	}

	//整页路由处理
	if(to.meta.fullpage){
		to.matched = [to.matched[to.matched.length-1]]
	}
	//加载动态/静态路由
	if(!isGetRouter){
    initRouter()
    if(to.matched.length == 0){
      router.push(to.fullPath)
    }
	}

	beforeEach(to, from)
	next();
});

router.afterEach((to, from) => {
	afterEach(to, from)
	NProgress.done()
});

router.onError((error) => {
	NProgress.done();
	ElNotification.error({
		title: '路由错误',
		message: error.message
	});
});

//入侵追加自定义方法、对象
router.getMenus = () => {
	var apiMenu = tool.data.get("MENU") || []
	var menu = [...userRoutes, ...apiMenu]
	return menu
}

//转换
function filterAsyncRouter(routerMap) {
	const accessedRouters = []
	routerMap.forEach(item => {
		item.meta = item.meta?item.meta:{};
		//处理外部链接特殊路由
		if(item.meta.type=='iframe'){
			item.meta.url = item.path;
			item.path = `/i/${item.name}`;
		}
		//MAP转路由对象
		var route = {
			path: item.path,
			name: item.name,
			meta: item.meta,
			redirect: item.redirect,
			children: item.children ? filterAsyncRouter(item.children) : null,
			component: loadComponent(item.component)
		}
		accessedRouters.push(route)
	})
	return accessedRouters
}

const modules = import.meta.glob('@renderer/views/**/*.vue')
const modulesMap = {}

Object.keys(modules).forEach(key => {
  const componentName = key.replace('/src/views', '').replace('.vue', '').replace('/index', '').replace('/', '')
  if (key.includes('index')) {
    modulesMap[`${componentName}/index`] = modules[key]
  }
  modulesMap[componentName] = modules[key]
})

function loadComponent(component) {
  if (component) {
    return modulesMap[component]
  } else {
    return () => import("/src/layout/other/empty")
  }
}

//路由扁平化
function flatAsyncRoutes(routes, breadcrumb=[]) {
	let res = []
	routes.forEach(route => {
		const tmp = {...route}
    if (tmp.children) {
      let childrenBreadcrumb = [...breadcrumb]
      childrenBreadcrumb.push(route)
      let tmpRoute = { ...route }
      tmpRoute.meta.breadcrumb = childrenBreadcrumb
      delete tmpRoute.children
      res.push(tmpRoute)
      let childrenRoutes = flatAsyncRoutes(tmp.children, childrenBreadcrumb)
      childrenRoutes.map(item => {
          res.push(item)
      })
    } else {
      let tmpBreadcrumb = [...breadcrumb]
      tmpBreadcrumb.push(tmp)
      tmp.meta.breadcrumb = tmpBreadcrumb
      res.push(tmp)
    }
  })
  return res
}

/**
 * 删除旧角色路由
 */
export function resetRouter() {
  isGetRouter = false
  const oldmenus = tool.data.get("MENU") || []
  /**
   * 先删除404路由，再添加，以保证404路由永远在路由表的最后
   */
  router.removeRoute(routes_404.name)
  removeRoute(oldmenus)
}

/**
 * 刷新新角色路由
 * @returns {boolean}
 */
export function initRouter(){
  const newmenus = tool.data.get("MENU") || []

  let menu = [ ...userRoutes, ...newmenus]
  var menuRouter = filterAsyncRouter(menu)

  menuRouter = flatAsyncRoutes(menuRouter)
  menuRouter.forEach(item => {
    router.addRoute("layout", item)
  })

  routes_404_r = router.addRoute(routes_404)

  isGetRouter = true;
}

/**
 * 递归删除路由
 * @param array
 */
function removeRoute(array){
  array.forEach((item) => {
    if(item.children){
      removeRoute(item.children)
    }
    router.removeRoute(item.name)
  })
}

export default router
